package poblacion;

import java.util.ArrayList;
import java.util.List;

import algoritmo.funciondeaptitud.FuncionDeAptitud;

import codificadorBinario.CodificadorDeIndividuos;


public class Cromosoma implements Comparable<Cromosoma> {
	private List<Individuo> individuos;
	
	private int puntuacion;
	
	public Cromosoma(List<Individuo> individuos){
		this.individuos=individuos;
		this.puntuacion = FuncionDeAptitud.puntuar(this);
	}

	public Cromosoma(Cromosoma cromosoma) {
		super();
		this.puntuacion = cromosoma.getPuntuacion();
		this.individuos = new ArrayList<Individuo>();
		for (Individuo i : cromosoma.getIndividuos()) {
			individuos.add(new Individuo(i));
		}
	}

	public List<Individuo> getIndividuos() {
		return individuos;
	}

	public void setIndividuos(List<Individuo> individuos) {
		this.individuos = individuos;
	}
	
	public String getCodificacionBinaria(){
		StringBuilder sbBuilder = new StringBuilder();
		for (Individuo i : individuos) {
			sbBuilder.append(i.getCodificacionBinaria());
		}
		return sbBuilder.toString();
	}
	
	public void SetCodificacionBinaria(String codificacionBinaria){
		this.individuos = new ArrayList<Individuo>();
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(0,11)));
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(11,22)));
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(22,33)));
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(33,44)));
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(44,55)));
		individuos.add(CodificadorDeIndividuos.bitsIndividuo(codificacionBinaria.substring(55)));
		this.puntuacion = FuncionDeAptitud.puntuar(this);

	}

	public Integer getPuntuacion() {
		return puntuacion;
	}

	public void setPuntuacion(Integer puntuacion) {
		this.puntuacion = puntuacion;
	}

	@Override
	public int compareTo(Cromosoma o) {
		return o.getPuntuacion().compareTo(this.puntuacion);
	}
	
	public String imprimir(){
		StringBuilder sb = new StringBuilder();
		
		sb.append("Puntuacion: "+this.puntuacion+"\n");
		
		sb.append(" Numero: " + this.individuos.get(0).getNumero()
				+ " Nacionalidad: " + this.individuos.get(0).getNacionalidad()
				+ " Posicion: " + this.individuos.get(0).getPosicion()
				+ " Marca: " + this.individuos.get(0).getMarca()+"\n");
		
		sb.append(" Numero: " + this.individuos.get(1).getNumero()
				+ " Nacionalidad: " + this.individuos.get(1).getNacionalidad()
				+ " Posicion: " + this.individuos.get(1).getPosicion()
				+ " Marca: " + this.individuos.get(1).getMarca()+"\n");
		
		sb.append(" Numero: " + this.individuos.get(2).getNumero()
				+ " Nacionalidad: " + this.individuos.get(2).getNacionalidad()
				+ " Posicion: " + this.individuos.get(2).getPosicion()
				+ " Marca: " + this.individuos.get(2).getMarca()+"\n");
		
		sb.append(" Numero: " + this.individuos.get(3).getNumero()
				+ " Nacionalidad: " + this.individuos.get(3).getNacionalidad()
				+ " Posicion: " + this.individuos.get(3).getPosicion()
				+ " Marca: " + this.individuos.get(3).getMarca()+"\n");
		
		sb.append(" Numero: " + this.individuos.get(4).getNumero()
				+ " Nacionalidad: " + this.individuos.get(4).getNacionalidad()
				+ " Posicion: " + this.individuos.get(4).getPosicion()
				+ " Marca: " + this.individuos.get(4).getMarca()+"\n");
		
		sb.append(" Numero: " + this.individuos.get(5).getNumero()
				+ " Nacionalidad: " + this.individuos.get(5).getNacionalidad()
				+ " Posicion: " + this.individuos.get(5).getPosicion()
				+ " Marca: " + this.individuos.get(5).getMarca()+"\n");
		
		return sb.toString();
	}
	
}
